package com.hliushi.spark.exmaple

import org.apache.spark.{SparkConf, SparkContext}

/**
 * descriptions: reduce 求平均值
 *
 * author: Hliushi
 * date: 2021/5/13 14:39
 */
object SparkReduce {

  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local").setAppName("SparkReduce")

    val sc = new SparkContext(conf)

    // 把String转为Long类型
    val numData = sc.textFile("./dataset/avg").map(num => num.toLong)

    // reduce处理每个值
    /**
     * def reduce(f: (T1, T2) => T): T
     * T1 是当前聚合后的变量, T2是当前进行聚合的元素
     * -----
     * 在本例子中, x存放的是累加后的值, y是当前值, x初始值为0
     * 事情上, x正式存放上次处理的结果, 而y则是本次的数值.
     * 不断做x+y就并且放回累加后的结果作为下一次的x的值, 这样就可以得到数值总和
     */
    println(numData.reduce((x, y) => {
      println(s"x = ${x}")
      println(s"y = ${y}")
      x + y
    }) / numData.count())

  }
}